import { Injectable } from '@angular/core';

import {Observable} from 'rxjs'

@Injectable({
  providedIn: 'root'
})
export class RequestService {

  constructor() { }

  // 同步
  getData() {
    return 'this is service data'
  }

  // 模拟异步
  // 回调函数
  getCallBackData(cb: Function) {
    setTimeout(() => {
      var data = 'callback'

      // return data               // 这样返回， 同步方法就获取不到这个数据

      return cb(data)            // 通过回调函数的方式解决

    }, 1000)
  }
  // promise
  getPromiseData() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        var data = 'promise'
        resolve(data)
      }, 1000)
    })
    
  }

  // rxjs方式   首先要引入 rxjs中的 方法
  getRxjsData() {
    return new Observable((observer) => {
      setTimeout(() => {
        var data = 'rxjs'

        observer.next(data)     // next 成功返回，和 resolve相似

        // observer.error('error')  // error错误返回， 和reject相似

      }, 1000)
    })
  }
  // rxjs的unsubscribe可以撤回这个方法的执行
  backRxjsData() {
    return new Observable((observer) => {
      setTimeout(() => {
        var data = 'rxjs--back'

        observer.next(data) 

      }, 3000)
    })
  }

  // rxjs的可以再多次执行时多次返回结果
  getRxjsIntervalData() {
    let count: number = 0;
    return new Observable((observer) => {
      setInterval(() => {
        count++;
        var data = 'rxjs--interval' + count;

        observer.next(data) 

      }, 1000)
    })
  }

}
